// 最小步数模型
#include <iostream>
#include <cstring>
#include <deque>
#define x first
#define y second
using namespace std;

using PII = pair<int,int> ;
const int N = 510, M = N*N;
const int dx[] = {-1,-1,1,1},dy[] = {-1,1,1,-1}; // 点方向数组
const int ix[] = {-1,-1,0,0},iy[] = {-1,0,0,-1}; // 格子方向数组
//i,j位置的点，对应的走到对角线上距离为0的线，在g中的坐标应该是
//左上：i-1，j-1，右上：i-1, j 右下：i，j 左下：i，j-1

const char dir[] = {'\\','/','\\','/'}; // 电线在各个方向的状态
// 表示某个点可选的走到4个点的花费为0字符，\/\/,顺时针

int n,m;
char g[N][N];
int dist[N][N];
bool st[N][N];
// #define ONLINE_GUDGE
#define DEBUG

int bfs()
{
    memset(dist, 0x3f, sizeof dist);
    memset(st, 0, sizeof st);

    deque<PII> q;
    q.push_back({0, 0});
    dist[0][0]=0;



    while(q.size())
    {
        auto t = q.front(); q.pop_front(); // 队头弹出

        if(st[t.x][t.y]) continue;
        st[t.x][t.y] = true;

        for(int k = 0; k < 4; k++)
        {
            int nx = t.x + dx[k], ny = t.y+dy[k];
            if(nx < 0 || nx > n || ny < 0 || ny > m) continue;

            int px = t.x + ix[k], py = t.y + iy[k];

            int d = dist[t.x][t.y] + (g[px][py] != dir[k]); // 理论方向与实际方向不同，即需要旋转，则边权为1

            // Dijkstra 判优
            if(d < dist[nx][ny])
            {
                dist[nx][ny] = d;

                // 需要旋转，边权不唯一，入队尾
                if(g[px][py] != dir[k]) q.push_back({nx, ny});
                else q.push_front({nx, ny}); // 否则在队头
                
            }
        }
    }

    return dist[n][m];
}

int main()
{

    #ifdef ONLINE_JUDGE

    #else
    freopen("./in.txt","r",stdin);
    #endif
    ios::sync_with_stdio(false);   
	cin.tie(0);

    int T;
    cin >> T;

    while(T--)
    {
        cin >> n >> m;
        for(int i = 0; i< n; i++) cin >> g[i];

        if(n + m & 1) cout << "NO SOLUTION" << endl; // 奇数点无解
        else cout << bfs() << endl;
    }

    return 0;
}